package icu.bughub.app.app.ui.components

import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.google.accompanist.placeholder.PlaceholderHighlight
import com.google.accompanist.placeholder.material.placeholder
import com.google.accompanist.placeholder.shimmer
import icu.bughub.app.app.viewmodel.MainViewModel
import kotlinx.coroutines.launch
import java.util.Timer
import java.util.TimerTask

@Composable
fun SwiperContent(viewModel: MainViewModel) {

    //虚拟页数
    var virtualCount = Int.MAX_VALUE / 2
    //实际页数
    var actualCount = viewModel.swiperData.size
    //初始图片下标
    var initialIndex = virtualCount / 2

    val pagerState = PagerState {
        virtualCount
    }


    val coroutineScope = rememberCoroutineScope()

    //定时器
    DisposableEffect(Unit) {
        coroutineScope.launch {
            viewModel.getBannerList()
        }
        val timer = Timer()
        timer.schedule(object : TimerTask() {
            override fun run() {
                if (viewModel.bannerLoadSuccess) {
                    coroutineScope.launch {
                        pagerState.animateScrollToPage(pagerState.currentPage + 1)
                    }
                }
            }
        }, 3000, 3000)

        onDispose {
            timer.cancel()
        }

    }


    //TODO 轮播图
    HorizontalPager(
        state = pagerState,
        modifier = Modifier
            .height(190.dp)
            .padding(horizontal = 8.dp, vertical = 4.dp),
        userScrollEnabled = viewModel.bannerLoadSuccess
    ) { index ->

        //实际下标
        //var actualIndex = index - (index.floorDiv(realCount)) * realCount
        var actualIndex = (index - initialIndex).floorMod(actualCount)
        //println("index = $index, actualIndex = $actualIndex, virtualCount = $virtualCount, realCount = $realCount")
        if (viewModel.swiperData.isEmpty()) {
            return@HorizontalPager
        }
        AsyncImage(
            model = viewModel.swiperData[actualIndex].imageUrl,
            contentDescription = null,
            modifier = Modifier
                .fillMaxWidth()
                .fillMaxHeight()
                .aspectRatio(7 / 3F)
                .placeholder(
                    visible = !viewModel.bannerLoadSuccess,
                    highlight = PlaceholderHighlight.shimmer(
                        highlightColor = Color(
                            0x66149ee7
                        )
                    )
                )
                .clip(RoundedCornerShape(8.dp)),
            contentScale = ContentScale.Crop
        )
    }

    /* com.google.accompanist.pager.HorizontalPager(
         count = virtualCount,
         modifier = Modifier.height(180.dp),
         state = pagerState,
         // userScrollEnabled = true,
     ) { index ->
         var actualIndex = index.floorMod(realCount)
         AsyncImage(
             model = viewModel.swiperData[actualIndex].imageUrl,
             contentDescription = null,
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxHeight()
                 .aspectRatio(7 / 3F), contentScale = ContentScale.Crop
         )

     }
 */
}


fun Int.floorMod(other: Int): Int = when (other) {
    0 -> this
    //将虚拟数据按照实际数据总数分为N组
    //当前虚拟下标是在这虚拟数据中的哪一组：虚拟下标floorDiv实际数据总数（虚拟下标/实际数据总数）。向下取整
    // 虚拟下标 -（虚拟下标/实际数据总数）* 实际数据总数 = 实际下标
    // 例如：虚拟下标是15，实际数据总数是5，那么实际下标就是15 - 3 * 5 = 0
    // 例如：虚拟下标是16，实际数据总数是5，那么实际下标就是16 - 3 * 5 = 1
    // 例如：虚拟下标是17，实际数据总数是5，那么实际下标就是17 - 3 * 5 = 2
    // 例如：虚拟下标是18，实际数据总数是5，那么实际下标就是18 - 3 * 5 = 3
    // 例如：虚拟下标是19，实际数据总数是5，那么实际下标就是19 - 3 * 5 = 4
    // 例如：虚拟下标是20，实际数据总数是5，那么实际下标就是20 - 3 * 5 = 0
    // 例如：虚拟下标是21，实际数据总数是5，那么实际下标就是21 - 3 * 5 = 1
    // 例如：虚拟下标是22，实际数据总数是5，那么实际下标就是22 - 3 * 5 = 2
    // 例如：虚拟下标是23，实际数据总数是5，那么实际下标就是23 - 3 * 5 = 3
    // 例如：虚拟下标是24，实际数据总数是5，那么实际下标就是24 - 3 * 5 = 4
    // 例如：虚拟下标是25，实际数据总数是5，那么实际下标就是25 - 3 * 5 = 0
    // 例如：虚拟下标是26，实际数据总数是5，那么实际下标就是26 - 3 * 5 = 1
    // 例如：虚拟下标是27，实际数据总数是5，那么实际下标就是27 - 3 * 5 = 2
    // 例如：虚拟下标是28，实际数据总数是5，那么实际下标就是28 - 3 * 5 = 3
    // 例如：虚拟下标是29，实际数据总数是5，那么实际下标就是29 - 3 * 5 = 4
    // 例如：虚拟下标是30，实际数据总数是5，那么实际下标就是30 - 3 * 5 = 0
    // 例如：虚拟下标是31，实际数据总数是5，那么实际下标就是31 - 3 * 5 = 1
    // 例如：虚拟下标是32，实际数据总数是5，那么实际下标就是32 - 3 * 5 = 2
    // 例如：虚拟下标是33，实际数据总数是5，那么实际下标就是33 - 3 * 5 = 3
    // 例如：虚拟下标是34，实际数据总数是5，那么实际下标就是34 - 3 * 5 = 4

    else -> this - floorDiv(other) * other
}